<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model; // 这个模型实现了数组的接口
// 注意：如果我们需要使用内置的 Auth门面，则我们的这个模型必须实现 这个接口
// Illuminate\Contracts\Auth\Authenticatable，但是如果我们自己写，这个很麻烦，laravel作者也考虑到了，则提供一种简化的方式，提供一个 trait（Illuminate\Auth\Authenticatable） 可以实现这个接口，我们只需要在自己的代码里面use这个trait即可。


class Admin extends Model implements \Illuminate\Contracts\Auth\Authenticatable
{
    use \Illuminate\Auth\Authenticatable; // 这个trait实现了 Illuminate\Contracts\Auth\Authenticatable
    // 这个开发模式叫做面向接口编程。别人定义接口 实现接口。接口可以起到更好的约束，同时利于后期的维护。

    public $table = 'admins';
    public $primaryKey = 'id';
    public $fillable = ['username', 'password', 'email', 'phoneNumber', 'mark_up', 'is_status', 'loginIp', 'loginTime']; // 代表允许添加的字段
//    public $guarded = ['id', 'created_at', 'updated_at']; // 下面是不允许添加的字段，是上面的反面
    public $timestamps = true;

    // 用户的模型 用户是存在角色 一个用户可以存在多个角色信息
    public function roles()
    {
        // 第一个参数：关联模型
        // 第二个参数：关联中间表
        // 第三个参数：外键【对应关联中间表的第一个字段】
        // 第四个参数：关联键【对应关联中间表的第二个字段】
        return $this->belongsToMany(\App\Http\Models\Role::class, 'admin_role', 'admin_id', 'role_id');

    }

    /**
     * 角色判断
     * @param $roleName
     * @return bool
     */
    public function hasRole($roleName)
    {
        // 现在要获取用户的所有的角色信息，和传递过来的做比较
        $flag = false;// 默认是没有该角色信息
        foreach ($this->roles()->get() as $v) {
            if($v->name == $roleName){
                $flag = true;
                break;
            }
        }
        return $flag;
    }

    /**
     * 判断用户是否存在对应的权限信息
     * @param $authName
     * @return bool
     */
    public function hasAuth($authName)
    {
        $flag = false; // 获取角色是否拥有该权限
        foreach ($this->roles()->get() as $v) {
            // 获取角色的权限
            foreach($v->auths()->get()  as $auth){
                if($authName == $auth->name){
                    $flag = true;
                    break 2; // 代表跳出两层循环
                }
            }
        }
        return $flag;
    }
}
